/**********************************************************************************
 *
 *	�ļ����ƣ�LinkUserNode.c
 * 	�ļ����ã����������ļ����������Ĳ���
 * 	�ļ����ߣ�WSY
 * 	�޸����ڣ�2023.12.25
 *  	ע������31
 *
 *	��Ȩ������CopyRight (c)  @cecelmx.126.com  All Right Reserved
 * ********************************************************************************/

#include "node.h"
#include "head.h"
#include "showImg.h"

/// @brief ����һ���ļ�·���������ɲ�����һ��UserDataType����
/// @param Name �ļ�·��
/// @return һ��UserDataType����
UserDataType GetNewUserData(char *Name)
{
    UserDataType NewUserData = {0}; // �½�����ʼ��һ�� Data ����

    if (Name != NULL)
    {

        char seekList[4] = {'\0'}; /*�½��ַ�����洢�ļ�ƫ����*/

        strncpy(seekList, Name + 14, 3); /*�����ļ�����ǰ3���ַ�������data/userInfo/00013878029396.txt*/

        int seekNum = atoi(seekList); /*���ַ���ƫ����תΪint���ͣ���������ȡ����*/

        FILE *userFile = fopen(Name, "a+"); /*��·��ָ���ļ�*/
       

        fseek(userFile, seekNum * 52, SEEK_SET); /*����ƫ�Ƶ�ָ���к�ǰ����0���ǲ�ƫ��*/

        char userData[53] = {'\0'}; /*����һ�����������һ������*/

        fread(userData, 52, 1, userFile); /*��ʼ��ȡһ������ */

        strcat(NewUserData.Name, Name);                    // ���ļ�·�������� Data ����ļ�����������
        strncpy(NewUserData.Id, userData + 3, 11);         // ���ļ��û�Id������ Data ���Id��������
        strncpy(NewUserData.Pw, userData + 17, 6);         // ���û����뿽���� Data ����û�Pw��������
        strncpy(NewUserData.Money, userData + 26, 6);      // ���û������� Data ���Money��������
        strncpy(NewUserData.creatDate, userData + 42, 10); // ���˻�����ʱ�俽���� Data ��Ĵ���ʱ����������

        fclose(userFile);           /* ��󽫴򿪵��ļ��ͷŵ� */
    }
    else
    {
        printf("�ļ�·��Ϊ�գ�\n");
    }

    return NewUserData;   /* ���ظ����ݽڵ� */
}

/// @brief ����һ���ļ�Data�����ַ������һ�������ö���Ľڵ����
/// @param NewUserData
/// @return һ�������ö���Ľڵ����
P_UserNode NewUserNode(UserDataType *NewUserData)
{
    /* ����һƬ�ռ�������½ڵ� */
    P_UserNode New_node = calloc(1, sizeof(UserNode));

    /*����ĵ�ַ�ǿյ�*/
    if (New_node == NULL)
    {
        printf("�ڴ治�㣬����ڵ�ռ�ʧ��~\n");
        return NULL;
    }

    /*�������Ĳ����ǿն���ָ��*/
    if (NewUserData != NULL)
    {
        memcpy(&New_node->Data, NewUserData, sizeof(UserDataType));
    }

    /* ���ڵ�ָ���ʼ����ǰ���ͺ�̶�ָ���Լ� */
    New_node->Next = New_node->Prev = New_node;

    return New_node;
}

/// @brief ����һ����ǰ�ڵ��һ���½ڵ㣬ʹ��β�巨���½ڵ�嵽����һ��λ��
/// @param head ��ǰ�ڵ�
/// @param New �½ڵ�
void Add2UserHead(P_UserNode head, P_UserNode New)
{

    // ����˼�룺�ȶ��½ڵ���в�����Ȼ���ٲ�������
    // 1. �á��½ڵ㡿�ġ����ָ�롿ָ�򡾵�һ����Ч���ݽڵ㡿
    New->Next = head->Next;

    // 2. �á��½ڵ㡿�ġ�ǰ��ָ�롿ָ��ͷ�ڵ�
    New->Prev = head;

    // 3. �������ġ�ͷ�ڵ㡿�ĺ��ָ��ָ���½ڵ�
    head->Next = New;

    // 4. �á���һ����Ч���ݽڵ㡿��ǰ��ָ��ָ���½ڵ�
    New->Next->Prev = New;

    return;
}

/// @brief ��ʾ����������һ���ļ�����ͷ�ڵ㣬�������������ݲ����
/// @param head �������ͷ���
void DisplayUserList(P_UserNode head)
{

    for (P_UserNode tmp = head->Next; tmp != head; tmp = tmp->Next)
    {

        printf("Path: [%s] \n userId: %s  \n userPw: %s  Money: %s \n creatDate:%s\n,",
               tmp->Data.Name,     /*��ӡ�ļ�·��*/
               tmp->Data.Id,       /*��ӡ�û��˺�*/
               tmp->Data.Pw,       /*��ӡ�û�����*/
               tmp->Data.Money,    /*��ӡ�ļ����*/
               tmp->Data.creatDate /*��ӡ����ʱ��*/
        );
    }
}

/// @brief ����һ���ļ��ڵ㣬���ڵ�������������
/// @param head  �����ٵ��ļ�����ͷ���
void DestroyUserNode(P_UserNode head)
{
    P_UserNode current = head->Next; // �ӵ�һ����Ч���ݽڵ㿪ʼ
    P_UserNode tmp;
    while (current != head)
    {
        tmp = current->Next; // �ȱ�����һ���ڵ��ָ��
        free(current);       // �ͷŵ�ǰ�ڵ���ڴ�
        current = tmp;       // ����������һ���ڵ�
    }
    head->Next = head; // ��ͷ���ָ���Լ�����ʾ����Ϊ��
    head->Prev = head; // ͬʱ����ͷ���� Prev ָ��
    // free(head);
    printf("�ļ��ڵ���ȫ���ͷ��ڴ���Դ!\n");
}
